﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CI.Caja.BE;
using System.Data.SqlClient;
using System.Data;

namespace CI.Caja.DL
{
   public class DA_Programacion : CI.Caja.DL.IDA_Programacion
    {

        DA_Utilitario objUtility = new DA_Utilitario();

        public DataTable GetProgramacion(BE_Programacion ProgramacionBE) {
            SqlConnection cnx = objUtility.getConnection();
            try
            {
                cnx.Open();
                SqlCommand cmd = new SqlCommand("sp_cargarprogramacion", cnx);
                cmd.CommandType = CommandType.StoredProcedure;

                var _with1 = (cmd.Parameters);
                _with1.Add("@semaa", SqlDbType.Int).Value = ProgramacionBE.Semana;
                _with1.Add("@mes", SqlDbType.Int).Value = ProgramacionBE.Mes;
                
                DataTable dt=new DataTable();

                SqlDataAdapter da =new SqlDataAdapter();
                da.SelectCommand=cmd;

                da.Fill(dt);

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
        }

        public BE_Programacion RegistrarProgramacion(BE_Programacion ProgramacionBE)
        {
            //SqlConnection cnx = objUtility.getConnection();
            
                //cnx.Open();
                //string sentencia = "INSERT INTO CA_PROGRAMACION (IDTURNO,IDPERSONAL,IDDIA,FECREG, " +
                //                    " FECINICIO,FECFIN) " +
                //                    " VALUES (@IDTURNO,@IDPERSONAL,@IDDIA,GETDATE(),@FECINICIO,@FECFIN)";

            string sentencia = "INSERT INTO CA_PROGRAMACION (IDTURNO,IDPERSONAL,IDDIA,FECREG, " +
                                " FECINICIO,FECFIN,IDPUNTOVENTA,IDSEDE) " +
                                " VALUES (@IDTURNO,@IDPERSONAL,@IDDIA,GETDATE(),'{0}','{1}',@IDPUNTOVENTA,@IDSEDE)";

            sentencia = String.Format(sentencia, ProgramacionBE.FecInicio, ProgramacionBE.FecFin);

                using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
                {
                    conexion.Open();
                    //transaccion = conexion.BeginTransaction();

                    try
                    {
                        using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                        {
                            //comando.Parameters.Add(new SqlParameter("@IDPROGRAMACION", ProgramacionBE.IdProgramacion));
                            comando.Parameters.Add(new SqlParameter("@IDTURNO", ProgramacionBE.IdTurno));
                            comando.Parameters.Add(new SqlParameter("@IDPERSONAL", ProgramacionBE.IdPersonal));
                            comando.Parameters.Add(new SqlParameter("@IDDIA", ProgramacionBE.IdDia));
                            comando.Parameters.Add(new SqlParameter("@IDPUNTOVENTA", ProgramacionBE.IdPuntoVenta));
                            comando.Parameters.Add(new SqlParameter("@IDSEDE", ProgramacionBE.IdSede));
                            //comando.Parameters.Add(new SqlParameter("@FECINICIO", DateTime.Parse(ProgramacionBE.FecInicio)));
                            //comando.Parameters.Add(new SqlParameter("@FECFIN", DateTime.Parse(ProgramacionBE.FecFin)));
                            comando.ExecuteNonQuery();
                        }
                    }
                    catch (SqlException error)
                    {
                        throw new Exception(error.Message);
                    }
                    finally
                    {
                        if (conexion != null)
                        {
                            if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
                        }
                    }
                }
                return ObtenerProgramacion(ProgramacionBE);
        }
        public BE_Programacion ActualizarProgramacion(BE_Programacion ProgramacionBE)
        {
            //SqlConnection cnx = objUtility.getConnection();

            //cnx.Open();
            string sentencia = "UPDATE CA_PROGRAMACION SET IDTURNO=@IDTURNO,IDPERSONAL=@IDPERSONAL, " +
                                " IDDIA=@IDDIA,FECINICIO='{0}',FECFIN='{1}',IDPUNTOVENTA=@IDPUNTOVENTA  " +
                                " WHERE IDPROGRAMACION=@IDPROGRAMACION";
            sentencia = String.Format(sentencia, ProgramacionBE.FecInicio, ProgramacionBE.FecFin);

            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                //transaccion = conexion.BeginTransaction();

                try
                {
                    using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                    {
                        comando.Parameters.Add(new SqlParameter("@IDPROGRAMACION", ProgramacionBE.IdProgramacion));
                        comando.Parameters.Add(new SqlParameter("@IDTURNO", ProgramacionBE.IdTurno));
                        comando.Parameters.Add(new SqlParameter("@IDPERSONAL", ProgramacionBE.IdPersonal));
                        comando.Parameters.Add(new SqlParameter("@IDDIA", ProgramacionBE.IdDia));
                        comando.Parameters.Add(new SqlParameter("@IDPUNTOVENTA", ProgramacionBE.IdPuntoVenta));
                        //comando.Parameters.Add(new SqlParameter("@FECINICIO",DateTime.Parse( ProgramacionBE.FecInicio)));
                        //comando.Parameters.Add(new SqlParameter("@FECFIN", DateTime.Parse(ProgramacionBE.FecFin)));
                        comando.ExecuteNonQuery();
                    }
                }
                catch (SqlException error)
                {
                    throw new Exception(error.Message);
                }
                finally
                {
                    if (conexion != null)
                    {
                        if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
                    }
                }
            }
            return ObtenerProgramacion(ProgramacionBE);
        }
        public ICollection<BE_Programacion> ListarProgramacion(BE_Programacion entiProgramacion) {
            ICollection<BE.BE_Programacion> programacionExistente = new List<BE.BE_Programacion>();
            BE_Programacion programacion = null;

            //string sentencia = "SELECT idPersonal, txtNombre, txtApellido, idCargo FROM CA_PERSONAL";
            StringBuilder sql = new StringBuilder();

                sql.Append("SELECT P.IDPROGRAMACION,P.IDTURNO,P.IDPERSONAL,");
                sql.Append(" P.IDSEDE,P.IDPUNTOVENTA,P.IDDIA,P.FECREG, ");
                sql.Append(" P.FECINICIO,P.FECFIN,T.TXTNOMBRE NOM_TURNO,T.HORAINICIO,T.HORAFIN, " );
                sql.Append(" D.TXTNOMDIA,PE.TXTNOMBRE,PE.TXTAPELLIDO,PV.TXTDESCRIPCION PTOVENTA ");
                sql.Append(" FROM CA_PROGRAMACION P " );
                sql.Append(" INNER JOIN CA_TURNO T  " );
                sql.Append(" ON P.IDTURNO=T.IDTURNO " );
                sql.Append(" INNER JOIN CA_PUNTOVENTA PV " );
                sql.Append(" ON PV.IDPUNTOVENTA=P.IDPUNTOVENTA " );
                sql.Append(" INNER JOIN CA_DIA D ON " );
                sql.Append(" P.IDDIA=D.IDDIA ");
                sql.Append(" INNER JOIN CA_PERSONAL PE ON ");
                sql.Append(" PE.IDPERSONAL=P.IDPERSONAL ");
                sql.Append(string.Format(" WHERE P.IDPERSONAL={0}", entiProgramacion.IdPersonal));
                sql.Append(" ORDER BY  ");


            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sql.ToString(), conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        programacion = new BE_Programacion();
                        programacion.IdProgramacion = (int)resultado["IDPROGRAMACION"];
                        programacion.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.DescripTurno = (string)resultado["NOM_TURNO"];
                        programacion.Turno.HoraInicio = (string)resultado["HORAINICIO"];
                        programacion.Turno.HoraFin = (string)resultado["HORAFIN"];
                        programacion.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.Nombre = (string)resultado["TXTNOMBRE"];
                        programacion.Personal.Apellido = (string)resultado["TXTAPELLIDO"];
                        programacion.IdSede = (int)resultado["IDSEDE"];
                        programacion.Ptoventa.IdPuntoVenta = (int)resultado["IDPUNTOVENTA"];
                        programacion.Ptoventa.IdPuntoVenta = (int)resultado["PTOVENTA"];
                        programacion.Dia.IdDia = (int)resultado["IDDIA"];
                        programacion.Dia.TxtNomDia = (string)resultado["TXTNOMDIA"];
                        programacion.FecReg = (DateTime)resultado["FECREG"];
                        //programacion.FecInicio = (DateTime)resultado["FECINICIO"];
                        //programacion.FecFin = (DateTime)resultado["FECFIN"];
                        programacion.FecInicio = (string)resultado["FECINICIO"];
                        programacion.FecFin = (string)resultado["FECFIN"];

                       
                        programacionExistente.Add(programacion);
                    }
                }
            }
            return programacionExistente;
        }
        public ICollection<BE_Programacion> ListarProgramacion()
        {
            ICollection<BE.BE_Programacion> programacionExistente = new List<BE.BE_Programacion>();
            BE_Programacion programacion = null;

            //string sentencia = "SELECT idPersonal, txtNombre, txtApellido, idCargo FROM CA_PERSONAL";
            StringBuilder sql = new StringBuilder();

            sql.Append("SELECT P.IDPROGRAMACION,P.IDTURNO,P.IDPERSONAL,");
            sql.Append(" P.IDSEDE,P.IDPUNTOVENTA,P.IDDIA,P.FECREG, ");
            sql.Append(" P.FECINICIO,P.FECFIN,T.TXTNOMBRE NOM_TURNO,T.HORAINICIO,T.HORAFIN, ");
            sql.Append(" D.TXTNOMDIA,PE.TXTNOMBRE,PE.TXTAPELLIDO,PV.TXTDESCRIPCION PTOVENTA ");
            sql.Append(" FROM CA_PROGRAMACION P ");
            sql.Append(" INNER JOIN CA_TURNO T  ");
            sql.Append(" ON P.IDTURNO=T.IDTURNO ");
            sql.Append(" INNER JOIN CA_PUNTOVENTA PV ");
            sql.Append(" ON PV.IDPUNTOVENTA=P.IDPUNTOVENTA ");
            sql.Append(" INNER JOIN CA_DIA D ON ");
            sql.Append(" P.IDDIA=D.IDDIA ");
            sql.Append(" INNER JOIN CA_PERSONAL PE ON ");
            sql.Append(" PE.IDPERSONAL=P.IDPERSONAL ");
            //sql.Append(string.Format(" WHERE P.IDPERSONAL={0}", entiProgramacion.IdPersonal));
            sql.Append(" ORDER BY PE.TXTAPELLIDO,P.IDDIA ");


            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sql.ToString(), conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        programacion = new BE_Programacion();
                        programacion.IdProgramacion = (int)resultado["IDPROGRAMACION"];
                        programacion.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.DescripTurno = (string)resultado["NOM_TURNO"];
                        programacion.Turno.HoraInicio = (string)resultado["HORAINICIO"];
                        programacion.Turno.HoraFin = (string)resultado["HORAFIN"];
                        programacion.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.Nombre = (string)resultado["TXTNOMBRE"];
                        programacion.Personal.Apellido = (string)resultado["TXTAPELLIDO"];
                        programacion.IdSede = (int)resultado["IDSEDE"];
                        programacion.Ptoventa.IdPuntoVenta = (int)resultado["IDPUNTOVENTA"];
                        programacion.Ptoventa.Descripcion = (string)resultado["PTOVENTA"];
                        programacion.Dia.IdDia = (int)resultado["IDDIA"];
                        programacion.Dia.TxtNomDia = (string)resultado["TXTNOMDIA"];
                        programacion.FecReg = (DateTime)resultado["FECREG"];
                        //programacion.FecInicio = (DateTime)resultado["FECINICIO"];
                        //programacion.FecFin = (DateTime)resultado["FECFIN"];
                        programacion.FecInicio = String.Format("{0:dd/MM/yyyy}", (DateTime)resultado["FECINICIO"]);
                        programacion.FecFin = String.Format("{0:dd/MM/yyyy}", (DateTime)resultado["FECFIN"]);


                        programacionExistente.Add(programacion);
                    }
                }
            }
            return programacionExistente;
        }
        public BE_Programacion ObtenerProgramacion(BE_Programacion programacionBE)
        {
            //ICollection<BE.BE_Programacion> programacionExistente = new List<BE.BE_Programacion>();
            BE_Programacion programacion = null;

            //string sentencia = "SELECT idPersonal, txtNombre, txtApellido, idCargo FROM CA_PERSONAL";
            StringBuilder sql = new StringBuilder();

            sql.Append("SELECT P.IDPROGRAMACION,P.IDTURNO,P.IDPERSONAL,");
            sql.Append(" P.IDSEDE,P.IDPUNTOVENTA,P.IDDIA,P.FECREG, ");
            sql.Append(" P.FECINICIO,P.FECFIN,T.TXTNOMBRE NOM_TURNO,T.HORAINICIO,T.HORAFIN, ");
            sql.Append(" D.TXTNOMDIA,PE.TXTNOMBRE,PE.TXTAPELLIDO,PV.TXTDESCRIPCION PTOVENTA ");
            sql.Append(" FROM CA_PROGRAMACION P ");
            sql.Append(" INNER JOIN CA_TURNO T  ");
            sql.Append(" ON P.IDTURNO=T.IDTURNO ");
            sql.Append(" INNER JOIN CA_PUNTOVENTA PV ");
            sql.Append(" ON PV.IDPUNTOVENTA=P.IDPUNTOVENTA ");
            sql.Append(" INNER JOIN CA_DIA D ON ");
            sql.Append(" P.IDDIA=D.IDDIA ");
            sql.Append(" INNER JOIN CA_PERSONAL PE ON ");
            sql.Append(" PE.IDPERSONAL=P.IDPERSONAL ");
            sql.Append(string.Format(" WHERE P.IDPROGRAMACION={0}", programacionBE.IdProgramacion));
            sql.Append(" ORDER BY PE.TXTAPELLIDO,P.IDDIA ");


            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sql.ToString(), conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        programacion = new BE_Programacion();
                        programacion.IdProgramacion = (int)resultado["IDPROGRAMACION"];
                        programacion.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.IdTurno = (string)resultado["IDTURNO"];
                        programacion.Turno.DescripTurno = (string)resultado["NOM_TURNO"];
                        programacion.Turno.HoraInicio = (string)resultado["HORAINICIO"];
                        programacion.Turno.HoraFin = (string)resultado["HORAFIN"];
                        programacion.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.IdPersonal = (string)resultado["IDPERSONAL"];
                        programacion.Personal.Nombre = (string)resultado["TXTNOMBRE"];
                        programacion.Personal.Apellido = (string)resultado["TXTAPELLIDO"];
                        programacion.IdSede = (int)resultado["IDSEDE"];
                        programacion.Ptoventa.IdPuntoVenta = (int)resultado["IDPUNTOVENTA"];
                        programacion.Ptoventa.Descripcion = (string)resultado["PTOVENTA"];
                        programacion.Dia.IdDia = (int)resultado["IDDIA"];
                        programacion.Dia.TxtNomDia = (string)resultado["TXTNOMDIA"];
                        programacion.FecReg = (DateTime)resultado["FECREG"];
                        //programacion.FecInicio = (DateTime)resultado["FECINICIO"];
                        //programacion.FecFin = (DateTime)resultado["FECFIN"];
                        programacion.FecInicio = String.Format("{0:dd/MM/yyyy}",(DateTime)resultado["FECINICIO"]);
                        programacion.FecFin = String.Format("{0:dd/MM/yyyy}",(DateTime)resultado["FECFIN"]);


                        //programacionExistente.Add(programacion);
                    }
                }
            }
            return programacion;
        }
        public string ObtenerCodigo()
        {
            string codigo = "";
            string sentencia = "Select MAX(idProgramacion)+1 as Codigo from ca_programacion";
            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        codigo = resultado["Codigo"].ToString();

                    }
                }
            }
            return codigo;
        }
        public int ValidaDuplicado(BE_Programacion programacionActualizado)
        {
            int codigo = 0;
            string sentencia = "Select count(*) as Codigo from CA_PROGRAMACION where idDia=@idDIA and idPersonal=@idPersonal and fecInicio>='{0}' and fecFin<='{1}'";

            sentencia = String.Format(sentencia, programacionActualizado.FecInicio, programacionActualizado.FecFin);
            using (SqlConnection conexion = new SqlConnection(DA_Utilitario.ObtenerConexion()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {

                    comando.Parameters.Add(new SqlParameter("@idDIA", programacionActualizado.IdDia));
                    comando.Parameters.Add(new SqlParameter("@idPersonal", programacionActualizado.IdPersonal));
                    
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        codigo = Convert.ToInt32(resultado["Codigo"]);
                    }
                }
            }
            return codigo;
        }


    }
}
